package com.cskaoyan.javase._2polymorphic._5instanof;

/**
 * 向下转型是很危险的,稍有不慎就会导致类型转换异常,程序终止
 * 所以Java提供了相应的语法,来支持判断向下转型是否能够成功,使用instanceof关键字
 * 强调一下: 实际开发当中,除非是绝对确定能够强转成功,一般情况下,若想强转,必须使用instanceof关键字先判断
 *
 * instanceof关键字的使用:
 * 引用名/对象名 instanceof 类名
 * 上述结构,用来判断:
 * 引用所指向的对象,是否是后面类名的对象或者子类对象
 * 如果是,上述结构返回true,否则结果就是false
 * 实际开发中,该语法结构普遍配合if使用
 *
 * 具体来说,配合强转使用时,语法结构返回true表示可以强转为"类名"
 * 否则不能强转
 *
 * 小细节/注意事项:
 * 当引用为null时,避免空指针异常,所以
 * null instanceof 任何类
 * 结果都是false
 *
 *
 * @since 14:42
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Grandfather gf = new Son();
        // 如果希望gf引用能够强转成Son,就需要做以下判断
        if (gf instanceof Son) {
            Son s = (Son) gf;
            s.testSon();
        }

        if (gf instanceof Father) {
            Father f = (Father) gf;
            f.testFather();
        }

        gf = null;
        /*Father f2 = (Father) gf;
        f2.testFather();*/
        System.out.println(gf instanceof Father);
    }
}

class Grandfather {
    void testGrandfather() {
        System.out.println("gf");
    }
}

class Father extends Grandfather {
    void testFather() {
        System.out.println("father");
    }
}

class Son extends Father {
    void testSon() {
        System.out.println("son");
    }
}